import createAction from './createAction'
/**
 * createAsyncThunk 接收 redux 动作类型和一个返回 promise 的异步请求函数\
 * 内部会生成3个动作类型 typePrefix/pending typePrefix/fulfilled typePrefix/rejected \
 * 
 * @param {*} typePrefix 动作类型前缀
 * @param {*} payloadCreator 异步请求函数 ( 需要返回一个 promise 实例 )
 */
function createAsyncThunk(typePrefix, payloadCreator) {
  // createAction 会返回 actionCreator 函数
  // actionCreator 函数调用后会返回一个 action 动作对象
  const pending = createAction(`${typePrefix}/pending`)
  const fulfilled = createAction(`${typePrefix}/fulfilled`, payload => {
    return {
      payload
    }
  })
  const rejected = createAction(`${typePrefix}/rejected`, payload =>{
    return {
      error : payload
    }
  })


  // 返回一个函数 会自动被 redux-thunk 中间件处理
  function actionCreator() {
    // 函数的返回值会作为 dispatch 函数的函数值
    return function (dispatch) {
      dispatch(pending()) // 先派发 pending 动作 ( dispatch 函数的返回值是接收的 action 动作对象 )
      const promise = payloadCreator() // 执行异步请求函数 获取 promise 
      return promise.then(
        result => {
          return dispatch(
            fulfilled(result)
          )
        }, // 成功态再派发 fulfilled 并把成功的值作为参数传递
        error => dispatch(rejected(error)), // 失败态则派发 rejected 并把失败的原因作为参数传递
      )
    }
  }

  // 给 actionCreator 函数扩展三个属性后返回 actionCreator
  return Object.assign(actionCreator, { pending, fulfilled, rejected })
}

export default createAsyncThunk
